/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import dao.exceptions.NonexistentEntityException;
import dao.exceptions.PreexistingEntityException;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import modelo.Usuario;

/**
 * DAO que acessa os registros da tabela usuario.
 *
 * @author emersonmx
 * @since 0.1
 */
public class DAOCadastroUsuario implements DAO {

  public DAOCadastroUsuario() {
    emf = Persistence.createEntityManagerFactory("siglemPU");
  }
  private EntityManagerFactory emf = null;

  public EntityManager getEntityManager() {
    return emf.createEntityManager();
  }

  public void inserir(Object o) {
    EntityManager em = null;
    try {
      em = getEntityManager();
      em.getTransaction().begin();
      em.persist(o);
      em.getTransaction().commit();
    } finally {
      if (em != null) {
        em.close();
      }
    }
  }

  public void alterar(Object o) throws NonexistentEntityException, Exception {
    EntityManager em = null;
    try {
      em = getEntityManager();
      em.getTransaction().begin();
      o = em.merge(o);
      em.getTransaction().commit();
    } catch (Exception ex) {
      String msg = ex.getLocalizedMessage();
      if (msg == null || msg.length() == 0) {
        Long id = ((Usuario) o).getId();
        if (pesquisar(id) == null) {
          throw new NonexistentEntityException("Usuário com id = " + id + " não existe.");
        }
      }
      throw ex;
    } finally {
      if (em != null) {
        em.close();
      }
    }
  }

  public void excluir(Long id) throws NonexistentEntityException {
    EntityManager em = null;
    try {
      em = getEntityManager();
      em.getTransaction().begin();
      Usuario usuario;
      try {
        usuario = em.getReference(Usuario.class, id);
        usuario.getId();
      } catch (EntityNotFoundException enfe) {
        throw new NonexistentEntityException("Usuário com id = " + id + " não existe.", enfe);
      }
      em.remove(usuario);
      em.getTransaction().commit();
    } finally {
      if (em != null) {
        em.close();
      }
    }
  }

  public List pesquisar() {
    return pesquisar(true, -1, -1);
  }

  public List pesquisar(Object o) {
    Usuario u = (Usuario) o;
    String sql = "";
    EntityManager em = getEntityManager();

    if(u.getNome() != null) {
      sql += " nome = '" + u.getNome() + "'";
    }
    if(u.getUsuario() != null) {
      if(!sql.isEmpty()) { sql += " and"; }
      sql += " usuario = '" + u.getUsuario() + "'";
    }
    if(u.getSenha() != null) {
      if(!sql.isEmpty()) { sql += " and"; }
      sql += " senha = '" + u.getSenha() + "'";
    }

    try {
      Query q = em.createQuery("select object(o) from Usuario as o" + (!sql.isEmpty() ? " where " : "") + sql);
      return q.getResultList();
    } catch (Exception e) {
      e.printStackTrace();
    }
    return new ArrayList();
  }

  public List pesquisar(int resultadosMaximo, int primeiroResultado) {
    return pesquisar(false, resultadosMaximo, primeiroResultado);
  }

  public List pesquisar(boolean tudo, int resultadosMaximo, int primeiroResultado) {
    EntityManager em = getEntityManager();
    try {
      Query q = em.createQuery("select object(o) from Usuario as o");
      if (!tudo) {
        q.setMaxResults(resultadosMaximo);
        q.setFirstResult(primeiroResultado);
      }
      return q.getResultList();
    } finally {
      em.close();
    }
  }

  public Object pesquisar(Long id) {
    EntityManager em = getEntityManager();
    try {
      return em.find(Usuario.class, id);
    } finally {
      em.close();
    }
  }

  public int contar() {
    EntityManager em = getEntityManager();
    try {
      Query q = em.createQuery("select count(o) from Usuario as o");
      return ((Long) q.getSingleResult()).intValue();
    } finally {
      em.close();
    }
  }

  /**
   * Quantas vezes vou ter que dizer que revogar só faz parte da lei!?!?!
   *
   * a interface era pra ser generica! quem djabo foi que mudou minha interface?
   * -,-
   */
  public boolean revogar(String a) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public boolean numeroLeiUnica(String numeroLei) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
